package com.hmall.item.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.item.domain.po.Item;
import com.hmall.item.mapper.ItemMapper;
import com.hmall.item.service.IItemService;
import com.hmall.common.exception.BizIllegalException;
import com.hmall.common.utils.BeanUtils;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 商品表 服务实现类
 * </p>
 *
 * @author 虎哥
 */
@Service
@RequiredArgsConstructor
public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements IItemService {

    private final ItemMapper itemMapper;

    @Override
    @Transactional
    public void deductStock(List<OrderDetailDTO> items) {
        String sqlStatement = "com.hmall.item.mapper.ItemMapper.updateStock";
        boolean r = false;
        try {
            //批量执行的方法
            //sqlSession：MyBatis 提供的会话对象，用于执行 SQL 操作。
            //entity：表示当前处理的 OrderDetailDTO 对象。
            r = executeBatch(items, (sqlSession, entity) -> sqlSession.update(sqlStatement, entity));
        } catch (Exception e) {
            throw new BizIllegalException("更新库存异常，可能是库存不足!", e);
        }
        if (!r) {
            throw new BizIllegalException("库存不足！");
        }
    }

    @Override
    public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
        return BeanUtils.copyList(listByIds(ids), ItemDTO.class);
    }

    /**
     * 批量回复库存
     * @param items
     */
    @Override
    @Transactional
    public void replyStock(List<OrderDetailDTO> items) {
        for (OrderDetailDTO item : items) {
            itemMapper.replyStock(item);
        }

        /*
        *  for (OrderDetailDTO orderDetailDTO : orderDetailDTOS) {
            Item item = lambdaQuery().eq(Item::getId, orderDetailDTO.getItemId()).one();
            lambdaUpdate()
                    .set(Item::getStock,item.getStock()+orderDetailDTO.getNum())
                    .eq(Item::getId, orderDetailDTO.getItemId())
                    .update();
        }
        * */

/*        String sqlStatement = "com.hmall.item.mapper.ItemMapper.replyStock";
        boolean r = false;
        try {
            // 采用批量方式执行
            r = executeBatch(items, (sqlSession, entity) -> sqlSession.update(sqlStatement, entity));
        } catch (Exception e) {
            log.error("恢复库存异常！", e);
            return; // 直接返回，防止异常向上抛出
        }
        if (!r) {
            log.warn("库存恢复失败！");
        }*/
    }



}
